﻿/* Documentación de respaldo: galeria.doc
 * Ahí se detalla cada uno de los objetos que componen a la galería por nombre y función
 * (la foto grande, la navegación de mini fotos, etc.)
 *
 * Bruma Rubí, 17-sep-2009
 */

import caurina.transitions.Tweener;

class Galeria {

	/* Índice de requerimientos y lógicas
	 * Todos los textos entre comillas se pueden buscar dentro del código para inspeccionar
	 * todos los puntos de incidencia de un requerimiento
	 *
	 * lógica: "visualización a tiempo de mini fotos"
	 * Evitar que las mini fotos se vayan viendo a medida que se van cargando, y
	 * hacer que se vean todas juntas al final cuando están todas cargadas
	 *
	 * requerimiento: "galería dentro de 1 catálogo", manejar la activación y desactivación
	 * de la galería dentro de 1 contenedor (manejo / responsabilidad externa de la
	 * activación y desactivación de esta galería)
	 *
	 * Requerimiento "botones de imagen siguiente e imagen anterior":
	 * que haya 1 botón para pasar a la imagen siguiente y otro para pasar a la anterior
	 * sin necesidad de clickera las mini fotos de una categoría / sección
	 * Cuando el usuario cambia de sección que los botones vuelvan a ser válidos dentro del
	 * contexto de la nueva sección seleccionada.
	 */

	var COLUMNAS:Number;
	var FOTOS_X_PAG:Number;
	var ANCHO_MINI_FOTO:Number;   // ancho de la foto miniatura, incluye 1 espacio de separación entre fotos
	var ALTO_MINI_FOTO:Number;   // alto de la foto miniatura, incluye 1 espacio de separación entre fotos
	var FILAS:Number;
	var _clip_destino:MovieClip;
	var biblioteca_mc:MovieClip;
	var lista_mc:MovieClip;
	var galeria_mc:MovieClip;
	var foto_mc:MovieClip;
	var my_xml:XML;
	var mcLoader:MovieClipLoader;
	var mclListener:Object;
	var mclListener2:Object;
	var mcLoader2:MovieClipLoader;
	var titulo_galeria_txt:TextField;   // objeto ficticio por ahora
	var y_ini, y_fin:Number;   // variables ficticias por ahora
	 
	function Galeria(clip_destino:MovieClip) {
		_clip_destino = clip_destino;
		COLUMNAS = 2;
		FOTOS_X_PAG = 8;
		ANCHO_MINI_FOTO = 78;   // ancho de la foto miniatura, incluye 1 espacio de separación entre fotos
		ALTO_MINI_FOTO = 65;   // ancho de la foto miniatura, incluye 1 espacio de separación entre fotos
		FILAS = FOTOS_X_PAG / COLUMNAS;
		
		biblioteca_mc = _clip_destino.biblioteca_mc;
		lista_mc = _clip_destino.lista_mc;
		galeria_mc = _clip_destino.galeria_mc;
		foto_mc = _clip_destino.foto_mc;
		
		/* Requerimiento: "galería dentro de 1 catálogo"
		 * Esta lógica quedó en desuso al estar la galería dentro de un catálogo, o bien dentro de
		 * 1 seción mayor que la contiene y se ocupa de la activación y desactivación de la galería
		 *
		 * var y_ini = _clip_destino._y;
		 * var y_fin = _clip_destino._y + _clip_destino._height;
		 * _clip_destino._y = y_fin;
		 * _clip_destino._alpha = 0;
		 * _parent.notif_inicio_seccion("galeria", this);
		 */
		 
		biblioteca_mc._visible = false;
		lista_mc._visible = false;
		_global.galeria_root = _clip_destino;
		_global.path = "";
		System.useCodepage = true;
		_global.galerias = new Array();
		// mini fotos de una sección de la galería (no fotos grandes)
		_global.fotos = new Array();
		// número de página actual
		_global.p = 0;
		// el índice de la última mini foto cargada en el proceso de carga
		// (vuelve a 0 al iniciar carga de 1 nueva sección)
		_global.c2 = 0;
		
		my_xml = new XML();
		my_xml["ref"] = this;
		my_xml.ignoreWhite = true;
		/* Cuando se terminó de cargar el archivo de configuración XML
		 */
		my_xml.onLoad = function (success)
		{
			trace("Galeria: archivo cargado");
			if (success)
			{
				var _loc3 = this/*my_xml*/.firstChild.childNodes;
				var element:Number;
				for (element=0; element<_loc3.length; element++)
				{
					var c:Number = _global.galerias.length;
					_global.galerias[c] = new Object();
					_global.galerias[c] = _loc3[element].attributes;
					// mini fotos de una sección de la galería (no fotos grandes)
					_global.galerias[c].fotos = new Array();
					if (_global.galeria_seleccionada != undefined && _loc3[element].attributes.id == _global.galeria_seleccionada || _loc3[element].attributes.id == 1 && _global.galeria_seleccionada == undefined)
					{
						_global.galeria_seleccionada = c;
					}
					// se incrementa en 1 la cantidad de elementos del array fotos
					// mini fotos de una sección de la galería (no fotos grandes)
					this["ref"].CargarGalerias(_global.galerias[c].fotos, _loc3[element].childNodes);
					var contenedor_mc:MovieClip = this["ref"].lista_mc.contentMain.attachMovie("Boton", "boton" + c + "_mc", c + 1, {_y: c * 20});
					contenedor_mc.titulo_txt.text = ">> " + unescape(_global.galerias[c].titulo);
					trace("Botón de cambio de sección: " + contenedor_mc);
					contenedor_mc.boton_btn.c = c;
					contenedor_mc.boton_btn["ref"] = this["ref"];
					/* Click del usuario para la selección de una nueva sección / categoría
					 * Conceptos relacionados: cambio de sección / cambio de categoría
					 */
					contenedor_mc.boton_btn.onRelease = function ()
					{
						_global.galeria_seleccionada = this.c;
						this["ref"].cargar_fotos();
					};
				}
				this["ref"].galeria_mc.otras_mc["ref"] = this["ref"];
				this["ref"].galeria_mc.otras_mc.onRelease = function ()
				{
					this["ref"].galeria_mc._visible = false;
					this["ref"].lista_mc._visible = true;
					this["ref"].lista_mc.efecto_mc.gotoAndPlay(1);
				};
				// hace el cambio de sección / cambio de categoría
				// para la carga de la sección / categoría predeterminada
				this["ref"].cargar_fotos();
			}
		};
		
		my_xml.load(_global.path + "fotos.xml.php");
		
		/* Escuchador de eventos de la carga de mini fotos (no fotos grandes)
		 */
		mclListener = new Object();
		mclListener["ref"] = this;
		mclListener.onLoadError = function ()
		{
			++_global.c2;
			/* Detección de la condición de que se cargaron todas las mini fotos
			 * (ver significado de las variables en su declaración)
			 */
			if (_global.c2 == _global.fotos.length)
			{
				/* En el contexto de un script colocado directamente sobre 1 fotograma de la línea de tiempo
				 * el método "comenzar" sería visible sin referenciarlo con objeto alguno ('this["ref"]'), por el hecho
				 * de que Galeria es una clase externa al objeto mclListener.
				 * En el contexto de una clase definida mediante archivo .as (este caso), no alcanza para
				 * que sea visible.
				 */
				this["ref"].comenzar();
			}
		};
		
		/* Cuando se carga una mini foto, palabras clave: mini foto, tamaño, escalar, ajustar, encajar, centrar, alinear
		 */
		mclListener.onLoadInit = function (target_mc)
		{
			trace("Encajar la mini foto a: " + target_mc._parent.borde_mc);
			var divisor:Number = target_mc._width / target_mc._parent.borde_mc._width;
			var divisor2:Number = target_mc._height / target_mc._parent.borde_mc._height;
			if (divisor2 <= divisor)
			{
				divisor = divisor2;
			}
			if(divisor>1) {
				target_mc._width = target_mc._width / divisor;
				target_mc._height = target_mc._height / divisor;
			}
			target_mc._x = target_mc._parent.borde_mc._x + (target_mc._parent.borde_mc._width - target_mc._width) / 2;
			target_mc._y = target_mc._parent.borde_mc._y + (target_mc._parent.borde_mc._height - target_mc._height) / 2;
			++_global.c2;
			if (_global.c2 == _global.fotos.length)
			{
				this["ref"].comenzar();
			}
		};
		
		mcLoader = new MovieClipLoader();
		mcLoader.addListener(mclListener);
		mclListener2 = new Object();
		
		/* Cuando se carga la foto grande
		 * parám: target_mc: el MovieClip donde se carga la foto
		 */
		mclListener2.onLoadInit = function (target_mc)
		{
			trace("onLoadInit " + target_mc._width);
			var divisor:Number = target_mc._width / target_mc._parent.mascara._width;
			var divisor2:Number = target_mc._height / target_mc._parent.mascara._height;
			if (divisor2 <= divisor)
			{
				divisor = divisor2;
			} // end if
			target_mc._width = target_mc._width / divisor;
			target_mc._height = target_mc._height / divisor;

			
			/* Para la función de centrado tomamos como ancho y alto máximo los de la
			 * máscara que enmascara el clip de las fotos
			 * (fórmula básica de centrado en el medio justo)
			 */
			target_mc._x = target_mc._parent.mascara._x + (target_mc._parent.mascara._width - target_mc._width) / 2;
			target_mc._y = target_mc._parent.mascara._y + (target_mc._parent.mascara._height - target_mc._height) / 2;

			
			/* En este punto (pos seteo de _width, _height, _x e _y del contenido target_mc)
			 * se puede notificar al panel del zoom que la imagen / contenido está
			 * listo para operar
			 */
			target_mc._parent.notif_cambio_contenido();
			
			_global.galeria_root.foto_mc.loading._visible = false;
			
			// req. textos descriptivos
			_global.galeria_root.foto_mc.descripcion_mc._visible = true;
			
			_global.galeria_root.foto_mc.efecto_mc.play();
			_global.galeria_root.foto_mc._alpha = 0;
			Tweener.addTween(_global.galeria_root.foto_mc, {_alpha: 100, delay: 0, time: 0.5, transition:"linear"});
		};
		mcLoader2 = new MovieClipLoader();
		mcLoader2.addListener(mclListener2);

		// Botones de desplazamiento / scroll de las mini fotos adelante_mc y atras_mc
		_clip_destino.galeria_mc["ref"] = this;
		_clip_destino.galeria_mc.adelante_mc.onRelease = function()
		{
			++_global.p;
			if (_global.p < Math.ceil(_global.fotos.length / this._parent["ref"].FOTOS_X_PAG))
			{
				var pagina:String = "0" + (_global.p + 1);
				var paginas:String = "0" + Math.ceil(_global.fotos.length / this._parent["ref"].FOTOS_X_PAG);
				_global.galeria_root.galeria_mc.pagina_txt.text = pagina.substr(-2) + "|" + paginas.substr(-2);
				//trace(_root.ANCHO_MINI_FOTO * _root.COLUMNAS);
				//_global.galeria_root.galeria_mc.fotos_mc.x = _global.p * -(this._parent["ref"].ANCHO_MINI_FOTO*this._parent["ref"].COLUMNAS) + 10;
				this._parent["ref"].set_fotos_x(_global.p * -(this._parent["ref"].ANCHO_MINI_FOTO*this._parent["ref"].COLUMNAS) + 10);
				trace(_global.galeria_root.galeria_mc.fotos_mc.x);
				this._parent.atras_mc.enabled = true;
				this._parent.atras_mc._alpha = 100;
			}
			else
			{
				--_global.p;
			}
			if (_global.p == Math.ceil(_global.fotos.length / this._parent["ref"].FOTOS_X_PAG) - 1)
			{
				this.enabled = false;
				this._alpha = 50;
			}
		}
		_clip_destino.galeria_mc.adelante_mc.onRollOver = function()
		{
			this.gotoAndPlay("rollOver");
		}
		_clip_destino.galeria_mc.adelante_mc.onReleaseOutside = _clip_destino.galeria_mc.adelante_mc.onRollOut = function()
		{
			this.gotoAndPlay("rollOut");
		}
		
		
		_clip_destino.galeria_mc.atras_mc.onRelease = function()
		{
			--_global.p;
			if (_global.p >= 0)
			{
				var pagina:String = "0" + (_global.p + 1);
				var paginas:String = "0" + Math.ceil(_global.fotos.length / this._parent["ref"].FOTOS_X_PAG);
				_global.galeria_root.galeria_mc.pagina_txt.text = pagina.substr(-2) + "|" + paginas.substr(-2);
				//_global.galeria_root.galeria_mc.fotos_mc.x = _global.p * -(this._parent["ref"].ANCHO_MINI_FOTO*this._parent["ref"].COLUMNAS) + 10;
				this._parent["ref"].set_fotos_x(_global.p * -(this._parent["ref"].ANCHO_MINI_FOTO*this._parent["ref"].COLUMNAS) + 10);
				this._parent.adelante_mc.enabled = true;
				this._parent.adelante_mc._alpha = 100;
			}
			else
			{
				_global.p = 0;
			}
			if (_global.p == 0)
			{
				this.enabled = false;
				this._alpha = 50;
			}
		}
		_clip_destino.galeria_mc.atras_mc.onRollOver = function()
		{
			this.gotoAndPlay("rollOver");
		}
		_clip_destino.galeria_mc.atras_mc.onReleaseOutside = _clip_destino.galeria_mc.atras_mc.onRollOut = function()
		{
			this.gotoAndPlay("rollOut");
		}
		
		/* Requerimiento botones de imagen siguiente e imagen anterior
		 * siguiente_mc y anterior_mc
		 *
		 * los que reciben el evento de click de cambio de foto son los objetos
		 * galeria_mc.fotos_mc["foto"+i+"_mc"], 0<=i<_global.fotos.length
		 *
		 * el puntero a la imagen actual es foto_mc.i_foto
		 * 
		 */
		galeria_mc.siguiente_mc["ref"] = this;
		galeria_mc.siguiente_mc.onRelease = function() {
			// simular click en el botón siguiente
			this["ref"].foto_mc.i_foto = (this["ref"].foto_mc.i_foto+1) % _global.fotos.length;
			this["ref"].galeria_mc.fotos_mc["foto"+this["ref"].foto_mc.i_foto+"_mc"].onRelease();
		}
		
		galeria_mc.anterior_mc["ref"] = this;
		galeria_mc.anterior_mc.onRelease = function() {
			// simular click en el botón anterior
			this["ref"].foto_mc.i_foto = this["ref"].foto_mc.i_foto-1;
			if(this["ref"].foto_mc.i_foto<0)
				this["ref"].foto_mc.i_foto = _global.fotos.length-1;
			this["ref"].galeria_mc.fotos_mc["foto"+this["ref"].foto_mc.i_foto+"_mc"].onRelease();
		}
	}

	/* Uso conocido: agregar al array global de galerías (secciones) 1 elemento más
	 * con la información del estado de cada sección
	 */
	function CargarGalerias(objeto, elementos)
	{
		var element, n:Number;
		for (element=0; element<elementos.length; element++)
		{
			n = objeto.length;
			objeto[n] = new Object();
			objeto[n] = elementos[element].attributes;
		}
	}
	
	/* Función de seteo / inicializadión de nueva sección /
	 * cambio de sección / cambio de categoría / carga de sección / carga de categoría
	 * - Inicio de carga de la foto grande
	 * - Seteo de las acciones de los botones de cambio de fotos
	 * - Posicionamiento de las minifotos en filas, columnas y grillas
	 * - Carga de todas las mini fotos de la sección
	 * - Inicialización de los botones adelante y atrás de mini fotos
	 */
	function cargar_fotos()
	{
		var i:Number;
		for (i = 0; i < _global.fotos.length; i++)
		{
			galeria_mc.fotos_mc["foto" + i + "_mc"].removeMovieClip();
		}
		galeria_mc._visible = true;
		_global.p = 0;
		set_fotos_x(10);
		//galeria_mc.fotos_mc.x = 10;
		_global.c2 = 0;
		lista_mc.scrolling(lista_mc);
		lista_mc._visible = false;
		my_xml = null;
		foto_mc.efecto_mc.gotoAndStop(1);
		galeria_mc.efecto_mc.gotoAndStop(1);
		foto_mc.loading._visible = true;
		mcLoader2.loadClip(_global.path + "fotos/" + _global.galerias[_global.galeria_seleccionada].fotos[0].id + ".jpg", foto_mc.foto_mc);
		
		// Requerimiento "botones de imagen siguiente e imagen anterior":
		foto_mc.i_foto = 0;
		
		// req. textos descriptivos
		foto_mc.descripcion_mc.texto_txt.html = true;
		foto_mc.descripcion_mc.texto_txt.htmlText = _global.galerias[_global.galeria_seleccionada].fotos[0].descripcion;
		foto_mc.descripcion_mc._visible = false;
		
		// asignación del objeto fotos global con el de la galería seleccionada
		delete _global.fotos;
		_global.fotos = _global.galerias[_global.galeria_seleccionada].fotos;
		if (_global.galerias[_global.galeria_seleccionada].id != 1)
		{
			titulo_galeria_txt.text = unescape(_global.galerias[_global.galeria_seleccionada].titulo);
		}
		else
		{
			titulo_galeria_txt.text = "";
		}
		delete _global.galeria_seleccionada;
		if (Math.ceil(_global.fotos.length / FOTOS_X_PAG) <= 1)
		{
			galeria_mc.pagina_txt._visible = galeria_mc.atras_mc.enabled = galeria_mc.adelante_mc.enabled = false;
			galeria_mc.atras_mc._alpha = galeria_mc.adelante_mc._alpha = 50;
		}
		else
		{
			galeria_mc.atras_mc.enabled = false;
			galeria_mc.atras_mc._alpha = 50;
			galeria_mc.adelante_mc.enabled= true;
			galeria_mc.adelante_mc._alpha = 100;
			galeria_mc.pagina_txt._visible = true;
		} // end else if
		var pagina:String = "0" + (_global.p + 1);
		var paginas:String = "0" + Math.ceil(_global.fotos.length / FOTOS_X_PAG);
		galeria_mc.pagina_txt.text = pagina.substr(-2) + "|" + paginas.substr(-2);
		var i:Number;
		for (i = 0; i < _global.fotos.length; i++)
		{
			/* disposición en 2 filas
			 * x cicla más rápido que y
			 * x = Math.floor(i / FOTOS_X_PAG) * COLUMNAS + i % COLUMNAS;
			 * y = Math.round((i%FOTOS_X_PAG) / FOTOS_X_PAG);
			 */
			 
			/* documentación de disposición en grillas, filas y columnas
			 *
			 * dada una secuencia de elementos [1, 2, 3, ..., n]
			 * se disponen en grillas, filas y columnas, en orden ascendente
			 * (de particular a general):
			 * 1ero. por fila,
			 * 2do. por columna y
			 * 3ro. por grilla
			 *
			 * Grillas:
			 * -------------    -------------    -------------    -------------    
			 * |           |    |           |    |           |    |           |    
			 * |           |    |           |    |           |    |           |    
			 * |           |    |           |    |           |    |           |    
			 * |           |    |           |    |           |    |           |    
			 * -------------    -------------    -------------    -------------    
			 * Fig.: cada uno de los rectángulos representa 1 grilla, con la misma canti
			 * dad de filas y columnas cada 1, salvo el último que puede tener menos filas,
			 * si la cantidad de fotos no es múltiplo de FOTOS_X_PAG
			 *
			 * la disposición de las grillas es horizontal
			 * Es decir: cada grilla está a la derecha de su anterior
			 *
			 * Llenado de grillas:
			 * Se llena una fila, pasa a la fila siguiente
			 * Se llena una grilla, pasa a la grilla siguiente
			 */
			 
			/* Punto de inserción de disposición en grillas, filas y columnas
			 * para modificar la disposición de filas y columnas 
			 * modificar las fórmulas x = ... e y = ...
			 * además ir a la sección "documentación de disposición en grillas, filas y columnas"
			 * y modificar la explicación de cómo está armado
			 */
			 var x:Number = Math.floor(i / FOTOS_X_PAG) * COLUMNAS + i % COLUMNAS;
			 var y:Number = Math.floor(i/COLUMNAS) % FILAS;
			 
			//trace("mini foto: (" + x + ", " + y +")");
			/* los que reciben el evento de click de cambio de foto son los objetos
			 * contenedor_mc==galeria_mc.fotos_mc["foto"+i+"_mc"]==
			 * ==los botones de las minifotos
			 */
			var contenedor_mc:MovieClip = galeria_mc.fotos_mc.attachMovie("Fotito", "foto" + i + "_mc", i + 1, {_x: x * ANCHO_MINI_FOTO, _y: y * ALTO_MINI_FOTO});
			contenedor_mc.onPress = function ()
			{
				this.boton_btn.gotoAndPlay("on2");
			};
			contenedor_mc.onRollOver = function ()
			{
				this.boton_btn.gotoAndPlay("on");
			};
			contenedor_mc.onReleaseOutside = contenedor_mc.onRollOut = function ()
			{
				this.boton_btn.gotoAndStop("off");
			};
			contenedor_mc.i = i;
			contenedor_mc["ref"] = this;
			// click del usuario para el cambio de imagen
			contenedor_mc.onRelease = function ()
			{
				/* Evitar que se siga aumentando o disminuyendo el zoom / desplazamiento
				 * sobre una imagen que ya no está más
				 */
				 _global.galeria_root.foto_mc.set_estable(false);
				
				//_global.galeria_root.foto_mc.efecto_mc.gotoAndStop(1);
				_global.galeria_root.foto_mc.loading._visible = true;
				this["ref"].mcLoader2.loadClip(_global.path + "fotos/" + _global.fotos[this.i].id + ".jpg", _global.galeria_root.foto_mc.foto_mc);
				
				// Requerimiento "botones de imagen siguiente e imagen anterior":
				_global.galeria_root.foto_mc.i_foto = this.i;
				
				// req. textos descriptivos
				_global.galeria_root.foto_mc.descripcion_mc.texto_txt.html = true;
				_global.galeria_root.foto_mc.descripcion_mc.texto_txt.htmlText = _global.fotos[this.i].descripcion;
				_global.galeria_root.foto_mc.descripcion_mc._visible = false;
				
			};
			mcLoader.loadClip(_global.path + "fotos_mini/" + _global.fotos[i].id + "_m.jpg", contenedor_mc.foto_mc);
			// lógica: "visualización a tiempo de mini fotos" (buscar texto entre comillas en el código)
			contenedor_mc.foto_mc._alpha = 0;
			
			// optativo para listas de fotos verticales
			// contenedor_mc: cada uno de los contenedores de las mini fotos
			//contenedor_mc._rotation = -90;
		} // fin for recorrido _global.fotos
	} // Fin de la función cargar_fotos

	/* Activación / habilitación / visualización / muestra de las mini fotos de cambio de foto
	 * this == mclListener o bien this==:Galeria, dependiendo de cómo sea invocada
	 */
	function comenzar()
	{
		//galeria_mc.efecto_mc.gotoAndPlay(2);
		galeria_mc._alpha = 0;
		// lógica: "visualización a tiempo de mini fotos" (buscar texto entre comillas en el código)
		var i:Number;
		for (i = 0; i < _global.fotos.length; i++) {
			galeria_mc.fotos_mc["foto" + i + "_mc"].foto_mc._alpha = 100;
		}
		Tweener.addTween(galeria_mc, {_alpha: 100, delay: 0, time: 0.5, transition:"linear"});
	}

	
	function set_fotos_x(x:Number) {
		galeria_mc.fotos_mc.x = x;
		Tweener.removeTweens(galeria_mc.fotos_mc);
		Tweener.addTween(galeria_mc.fotos_mc, {_x: x, delay: 0, time: 1, transition: "easeOutExpo"});
	}
	
	/* Requerimiento "galería dentro de 1 catálogo" */
	function activar() {
		_clip_destino._y += y_fin;
		Tweener.addTween(_clip_destino, {_y: y_ini, _alpha: 100, delay: 0, time: 0.75, transition:"easeOutQuad"});
		Tweener.addCaller(_clip_destino, {delay: 0, time: 0.75, count: 2, onUpdate:null, onComplete:_clip_destino.fin_2, transition:"easeOutQuad"});
	}

	/* Requerimiento "galería dentro de 1 catálogo" */
	function fin_2() {
		_parent.notif_carga_2();
	}

	/* Requerimiento "galería dentro de 1 catálogo" */
	function desactivar() {
		_clip_destino._y += y_ini;
		Tweener.addTween(_clip_destino, {_y: y_fin, _alpha: 0, delay: 0, time: 0.75, transition:"easeOutQuad"});
		Tweener.addCaller(this, {delay: 0, time: 0.75, count: 2, onUpdate:null, onComplete:this.fin, transition:"easeOutQuad"});
	}

	/* Requerimiento "galería dentro de 1 catálogo" */
	function fin() {
		_parent.notif_desactivar();
	}
}